
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>16、Netty 的反应式编程支持 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>16、Netty 的反应式编程支持 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">文档中用什么比喻来解释Netty的反应式编程模型，以区别于传统的“请求-响应”模式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档用“订阅报纸”来比喻。你不需要每天去问报社报纸是否已出版，而是在报纸送到时自然会收到通知。这体现了从“我要什么”到“当发生什么时我要做什么”的思维转变。</div>
          </div>
          <div class="card-source">来源: 反应式编程</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Netty的EventLoop核心的无限循环（`for (;;)`）中主要执行哪两项关键任务？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">EventLoop的核心无限循环主要执行两项任务：1. 检查并运行任务队列中的所有任务（`runAllTasks()`）。2. 监听并处理IO事件（`selector.select()` 和 `processSelectedKeys()`）。</div>
          </div>
          <div class="card-source">来源: EventLoop</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">根据文档，Netty性能优化的“第一条铁律”是什么？为什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Netty优化的第一条铁律是：永远不要在EventLoop中放入重CPU计算或阻塞操作。因为EventLoop是单线程的，执行耗时操作会阻塞整个循环，导致所有其他IO事件和任务的处理被延迟。</div>
          </div>
          <div class="card-source">来源: EventLoop</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">ChannelPipeline采用了什么设计模式来组织事件处理逻辑？文档中用了什么比喻来形容它？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">ChannelPipeline采用了责任链模式。文档将其比喻为城市的地铁系统，数据像乘客一样，从一个站点（Handler）到另一个站点，并在每个站点接受不同的处理。</div>
          </div>
          <div class="card-source">来源: ChannelPipeline</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在实现ChannelHandler时，文档强调了哪个容易被忽视的关键内存管理操作？忽略它会导致什么后果？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档强调了必须注意资源释放，特别是调用 `ReferenceCountUtil.release(msg)`。因为Netty的ByteBuf使用了引用计数模型，如果忘记释放，会导致内存泄漏。</div>
          </div>
          <div class="card-source">来源: ChannelHandler</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">对于耗时的业务逻辑，文档推荐的正确处理方式是什么，以避免阻塞IO线程？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档推荐将耗时的业务逻辑提交给专门的业务线程池来处理，而不是在EventLoop中直接执行。这样可以避免阻塞IO线程，从而保证系统的性能和响应能力。</div>
          </div>
          <div class="card-source">来源: 异步任务处理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">文档中将Netty的Channel比作什么？它在系统中扮演什么角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档将Channel比作一个“管道入口”。它代表一个网络连接，所有的数据和事件都通过它流入系统，它不仅仅是Java Socket的简单包装。</div>
          </div>
          <div class="card-source">来源: Channel</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在`AbstractNioChannel`中，`doBeginRead()`方法是如何将Netty的事件模型与Java NIO底层机制连接起来的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`doBeginRead()`方法通过在`selectionKey`上注册读事件（`SelectionKey.OP_READ`），将Netty的事件模型与Java底层的Selector机制连接起来。这使得EventLoop能够监听到该Channel上的读就绪事件。</div>
          </div>
          <div class="card-source">来源: Channel</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在规划ChannelPipeline时，文档提到了一个什么重要的注意事项？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档提到，在规划Pipeline时，Handler的顺序非常重要。一个错误的顺序可能会导致莫名其妙的问题，尤其是在涉及编解码的场景中。</div>
          </div>
          <div class="card-source">来源: 反思与经验</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
